package dominio.fantasma;

import dominio.comun.IComestible;
import dominio.comun.IMolestable;
import dominio.comun.IMovible;
import dominio.comun.IPosicionable;
import dominio.comun.Posicion;
import dominio.comun.PosicionFactory;
import dominio.comun.sentidosMovimiento.SentidoMovimiento;
import dominio.fantasma.estados.EstadoFantasma;
import dominio.fantasma.estrategiasMovimiento.EstrategiaMovimiento;

public class Fantasma implements IFantasma, IComestible, IPosicionable, IMolestable, IMovible {

	private String id;
	private int contadorTicks;
	private EstadoFantasma estadoFantasma;
	private Posicion posicion;
	private EstrategiaMovimiento miEstrategiaMovimiento;
	private SentidoMovimiento miSentidoMovimiento;

	public Fantasma(String id) {
		this.id = id;
		this.contadorTicks=0;
	}

	@Override
	public void setEstadoFantasma(EstadoFantasma estadoFantasma) {
		this.estadoFantasma = estadoFantasma;
		this.estadoFantasma.iniciar();
	}

	@Override
	public void setPosicion(Posicion posicion) {
		this.posicion = posicion;
	}

	@Override
	public void convertirEnPresa() {
		this.estadoFantasma.convertirEnPresa();
	}

	@Override
	public void comer() {
		this.estadoFantasma.matar();
	}

	@Override
	public void molestar() {
		this.estadoFantasma.molestar();
	}

	@Override
	public void mover() {
		this.contadorTicks= this.contadorTicks+1;
		int cadaCuantoMeMuevo = estadoFantasma.getMaximaAgresividad()+ 1 - this.estadoFantasma.getAgresividad();
		boolean deboMoverme= (this.contadorTicks % cadaCuantoMeMuevo)==0;
		if (deboMoverme) 
			this.estadoFantasma.mover(this.posicion);
	}

	@Override
	public int getAgresividad() {
		return this.estadoFantasma.getAgresividad();
	}

	@Override
	public Posicion getPosicion() {
		Posicion posRetorno = new PosicionFactory()
				.copiarPosicion(this.posicion);
		return posRetorno;
	}

	@Override
	public String getEstadoString() {
		return this.estadoFantasma.toString();
	}

	@Override
	public String toString() {
		return "Fantasma " + this.estadoFantasma.toString()
				+ " con agresividad " + this.estadoFantasma.getAgresividad();
	}

	@Override
	public void setEstrategiaMovimiento(EstrategiaMovimiento estrategia) {
		this.miEstrategiaMovimiento = estrategia;
	}

	@Override
	public EstrategiaMovimiento getEstrategiaMovimiento() {
		return miEstrategiaMovimiento;
	}

	@Override
	public void setSentidoMovimiento(SentidoMovimiento sentido) {
		this.miSentidoMovimiento = sentido;

	}

	@Override
	public SentidoMovimiento getSentidoMovimiento() {
		return miSentidoMovimiento;
	}

	@Override
	public String getId() {
		return this.id;
	}

	@Override
	public EstadoFantasma getEstadoFantasma() {
		return this.estadoFantasma;
	}

}
